#include <Arduino.h>
#include <TFT_eSPI.h>
#include <WiFi.h>
#include <lvgl.h>
#include <ui.h>

String ssid = "Yeharold";
String password = "123456789";

int getSignalQuality(int rssi);
bool isWiFiConnected();
void updateData(lv_timer_t *timer);

/*Don't forget to set Sketchbook location in File/Preferences to the path of your UI project (the parent foder of this
 * INO file)*/

/*Change to your screen resolution*/
static const uint16_t screenWidth = 320;
static const uint16_t screenHeight = 172;

static lv_disp_draw_buf_t draw_buf;
static lv_color_t buf[screenWidth * screenHeight / 10];

TFT_eSPI tft = TFT_eSPI(screenWidth, screenHeight); /* TFT instance */

#if LV_USE_LOG != 0
/* Serial debugging */
void my_print(const char *buf)
{
    Serial.printf(buf);
    Serial.flush();
}
#endif

/* Display flushing */
void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p)
{
    uint32_t w = (area->x2 - area->x1 + 1);
    uint32_t h = (area->y2 - area->y1 + 1);

    tft.startWrite();
    tft.setAddrWindow(area->x1, area->y1, w, h);
    tft.pushColors((uint16_t *)&color_p->full, w * h, true);
    tft.endWrite();

    lv_disp_flush_ready(disp);
}

void setup()
{
    Serial.begin(115200); /* prepare for possible serial debug */

    WiFi.mode(WIFI_MODE_STA);
    Serial.println("Connecting to WIFI");
    WiFi.begin(ssid, password);

    String LVGL_Arduino = "Hello Arduino! ";
    LVGL_Arduino += String('V') + lv_version_major() + "." + lv_version_minor() + "." + lv_version_patch();

    Serial.println(LVGL_Arduino);
    Serial.println("I am LVGL_Arduino");

    lv_init();

#if LV_USE_LOG != 0
    lv_log_register_print_cb(my_print); /* register print function for debugging */
#endif

    tft.begin();        /* TFT init */
    tft.setRotation(1); /* Landscape orientation, flipped */

    lv_disp_draw_buf_init(&draw_buf, buf, NULL, screenWidth * screenHeight / 10);

    /*Initialize the display*/
    static lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    /*Change the following line to your display resolution*/
    disp_drv.hor_res = screenWidth;
    disp_drv.ver_res = screenHeight;
    disp_drv.flush_cb = my_disp_flush;
    disp_drv.draw_buf = &draw_buf;
    lv_disp_drv_register(&disp_drv);

    /*Initialize the (dummy) input device driver*/
    static lv_indev_drv_t indev_drv;
    lv_indev_drv_init(&indev_drv);
    indev_drv.type = LV_INDEV_TYPE_POINTER;
    // indev_drv.read_cb = my_touchpad_read;
    lv_indev_drv_register(&indev_drv);

    ui_init();
    Gear_Animation(ui_gear, 0);
    Gearmin_Animation(ui_gearmin, 0);
    lv_timer_create(updateData, 500, NULL);
    Serial.println("Setup done");
}

void loop()
{
    lv_timer_handler(); /* let the GUI do its work */
    delay(5);
}

int getSignalQuality(int rssi)
{
    if (rssi >= -50)
    {
        return 0; // Excellent
    }
    else if (rssi >= -67)
    {
        return 1; // Good
    }
    else if (rssi >= -70)
    {
        return 2; // Fair
    }
    else if (rssi >= -80)
    {
        return 3; // Weak
    }
    else if (rssi >= -90)
    {
        return 4; // Poor
    }
    else
    {
        return 5; // Very Poor
    }
}

bool isWiFiConnected()
{
    return WiFi.status() == WL_CONNECTED;
}

void updateData(lv_timer_t *timer)
{
    lv_label_set_text(ui_batVoltage, String(WiFi.RSSI()).c_str());
    lv_label_set_text(ui_iplbl, WiFi.localIP().toString().c_str());
    lv_label_set_text(ui_gatewaylbl, WiFi.gatewayIP().toString().c_str());
    lv_label_set_text(ui_maclbl, String(WiFi.macAddress()).c_str());
    lv_label_set_text(ui_subnetlbl, WiFi.subnetMask().toString().c_str());
    lv_obj_set_pos(ui_Panel4, -22, -19 + (getSignalQuality(WiFi.RSSI()) * 18));

    if (isWiFiConnected())
    {
        lv_label_set_text(ui_statusLBL, "CONNECTED");
    }
    else
    {
        lv_label_set_text(ui_statusLBL, "DISCONNECTED");
    }
}